// 导出工具

/**
 * 将数据导出为CSV格式
 * @param {Array<Object>} data 要导出的数据数组
 * @param {Array<{key: string, label: string}>} columns 列配置
 * @param {string} filename 文件名，不含扩展名
 */
export function exportToCSV(data, columns, filename = 'export') {
  if (!data || !data.length || !columns || !columns.length) {
    console.error('导出数据或列配置为空')
    return
  }

  // 添加BOM以正确显示中文
  let csvContent = '\\ufeff'

  // 添加表头
  csvContent +=
    columns
      .map((col) => {
        // 处理包含逗号的内容，用双引号包裹
        const label = col.label || col.key
        return label.includes(',') ? `"${label}"` : label
      })
      .join(',') + '\\n'

  // 添加数据行
  data.forEach((row) => {
    const rowContent = columns
      .map((col) => {
        let cellValue = row[col.key]

        // 处理特殊类型
        if (cellValue === null || cellValue === undefined) {
          cellValue = ''
        } else if (typeof cellValue === 'object') {
          cellValue = JSON.stringify(cellValue)
        } else {
          cellValue = String(cellValue)
        }

        // 处理包含逗号、换行符或双引号的内容
        if (cellValue.includes(',') || cellValue.includes('\\n') || cellValue.includes('"')) {
          // 将双引号替换为两个双引号
          cellValue = cellValue.replace(/"/g, '""')
          // 用双引号包裹
          cellValue = `"${cellValue}"`
        }

        return cellValue
      })
      .join(',')

    csvContent += rowContent + '\\n'
  })

  // 创建Blob对象
  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' })

  // 下载文件
  downloadFile(blob, `${filename}.csv`)
}

/**
 * 将数据导出为Excel格式（使用第三方库xlsx）
 * 注意：此函数需要安装xlsx库: npm install xlsx
 * @param {Array<Object>} data 要导出的数据数组
 * @param {Array<{key: string, label: string}>} columns 列配置
 * @param {string} filename 文件名，不含扩展名
 * @param {string} sheetName 工作表名称
 */
export async function exportToExcel(data, columns, filename = 'export', sheetName = 'Sheet1') {
  if (!data || !data.length || !columns || !columns.length) {
    console.error('导出数据或列配置为空')
    return
  }

  try {
    // 动态导入xlsx库
    const XLSX = await import('xlsx')

    // 准备工作表数据
    const worksheetData = [
      // 表头行
      columns.map((col) => col.label || col.key),
    ]

    // 数据行
    data.forEach((row) => {
      const rowData = columns.map((col) => {
        let cellValue = row[col.key]

        // 处理特殊类型
        if (cellValue === null || cellValue === undefined) {
          return ''
        } else if (typeof cellValue === 'object' && !(cellValue instanceof Date)) {
          return JSON.stringify(cellValue)
        }

        return cellValue
      })

      worksheetData.push(rowData)
    })

    // 创建工作表
    const worksheet = XLSX.utils.aoa_to_sheet(worksheetData)

    // 创建工作簿
    const workbook = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)

    // 导出工作簿
    XLSX.writeFile(workbook, `${filename}.xlsx`)
  } catch (error) {
    console.error('Excel导出失败', error)
    // 如果xlsx库未安装，回退到CSV导出
    exportToCSV(data, columns, filename)
  }
}

/**
 * 将数据导出为PDF格式
 * 注意：此函数需要安装html2pdf.js库: npm install html2pdf.js
 * @param {Array<Object>} data 要导出的数据数组
 * @param {Array<{key: string, label: string}>} columns 列配置
 * @param {string} filename 文件名，不含扩展名
 * @param {string} title 标题
 * @param {Object} options PDF配置选项
 */
export async function exportToPDF(data, columns, filename = 'export', title = '', options = {}) {
  if (!data || !data.length || !columns || !columns.length) {
    console.error('导出数据或列配置为空')
    return
  }

  try {
    // 动态导入html2pdf.js库
    const html2pdf = (await import('html2pdf.js')).default

    // 创建临时容器
    const container = document.createElement('div')
    container.style.display = 'none'
    document.body.appendChild(container)

    // 添加标题
    if (title) {
      const titleElement = document.createElement('h2')
      titleElement.textContent = title
      titleElement.style.textAlign = 'center'
      container.appendChild(titleElement)
    }

    // 创建表格
    const table = document.createElement('table')
    table.style.width = '100%'
    table.style.borderCollapse = 'collapse'

    // 添加表头
    const thead = document.createElement('thead')
    const headerRow = document.createElement('tr')

    columns.forEach((col) => {
      const th = document.createElement('th')
      th.textContent = col.label || col.key
      th.style.border = '1px solid #ddd'
      th.style.padding = '8px'
      th.style.backgroundColor = '#f2f2f2'
      headerRow.appendChild(th)
    })

    thead.appendChild(headerRow)
    table.appendChild(thead)

    // 添加数据行
    const tbody = document.createElement('tbody')

    data.forEach((row, rowIndex) => {
      const tr = document.createElement('tr')
      tr.style.backgroundColor = rowIndex % 2 === 0 ? '#fff' : '#f9f9f9'

      columns.forEach((col) => {
        const td = document.createElement('td')
        let cellValue = row[col.key]

        // 处理特殊类型
        if (cellValue === null || cellValue === undefined) {
          cellValue = ''
        } else if (typeof cellValue === 'object' && !(cellValue instanceof Date)) {
          cellValue = JSON.stringify(cellValue)
        }

        td.textContent = cellValue
        td.style.border = '1px solid #ddd'
        td.style.padding = '8px'

        tr.appendChild(td)
      })

      tbody.appendChild(tr)
    })

    table.appendChild(tbody)
    container.appendChild(table)

    // 默认配置
    const defaultOptions = {
      margin: [10, 10],
      filename: `${filename}.pdf`,
      image: { type: 'jpeg', quality: 0.98 },
      html2canvas: { scale: 2, useCORS: true },
      jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
    }

    // 合并配置
    const pdfOptions = { ...defaultOptions, ...options }

    // 生成PDF
    await html2pdf().from(container).set(pdfOptions).save()

    // 移除临时容器
    document.body.removeChild(container)
  } catch (error) {
    console.error('PDF导出失败', error)
    // 如果html2pdf.js库未安装，回退到CSV导出
    exportToCSV(data, columns, filename)
  }
}

/**
 * 将数据导出为Markdown格式
 * @param {Array<Object>} data 要导出的数据数组
 * @param {Array<{key: string, label: string}>} columns 列配置
 * @param {string} filename 文件名，不含扩展名
 * @param {string} title 标题
 */
export function exportToMarkdown(data, columns, filename = 'export', title = '') {
  if (!data || !data.length || !columns || !columns.length) {
    console.error('导出数据或列配置为空')
    return
  }

  let mdContent = ''

  // 添加标题
  if (title) {
    mdContent += `# ${title}\\n\\n`
  }

  // 添加表头
  mdContent += '| ' + columns.map((col) => col.label || col.key).join(' | ') + ' |\\n'

  // 添加分隔行
  mdContent += '| ' + columns.map(() => '---').join(' | ') + ' |\\n'

  // 添加数据行
  data.forEach((row) => {
    mdContent +=
      '| ' +
      columns
        .map((col) => {
          let cellValue = row[col.key]

          // 处理特殊类型
          if (cellValue === null || cellValue === undefined) {
            return ''
          } else if (typeof cellValue === 'object' && !(cellValue instanceof Date)) {
            return JSON.stringify(cellValue)
          }

          // 处理包含管道符的内容
          return String(cellValue).replace(/\|/g, '\\|')
        })
        .join(' | ') +
      ' |\\n'
  })

  // 创建Blob对象
  const blob = new Blob([mdContent], { type: 'text/markdown;charset=utf-8' })

  // 下载文件
  downloadFile(blob, `${filename}.md`)
}

/**
 * 下载文件的通用方法
 * @param {Blob} blob Blob对象
 * @param {string} filename 文件名
 */
function downloadFile(blob, filename) {
  // 创建下载链接
  const link = document.createElement('a')
  link.href = URL.createObjectURL(blob)
  link.download = filename

  // 模拟点击下载
  document.body.appendChild(link)
  link.click()

  // 清理
  setTimeout(() => {
    document.body.removeChild(link)
    URL.revokeObjectURL(link.href)
  }, 100)
}
